﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using DAL.Entity;

namespace DAL.Persistencia
{
    public class MealDAL
    {

        private NewTierraEntities Con;

        public MealDAL()
        {
            Con = new NewTierraEntities();
        }

        //NewTierraEntities Con = new NewTierraEntities();

        public void Salvar(S_Mercado_Meal c)
        {
            try
            {

                //Rotinas prontas para o banco de dados
                Con.AddToS_Mercado_Meal(c); //insert into S_Mercado_Meal values...
                Con.SaveChanges(); //Executar a operação

            }
            catch
            {
                throw;
            }
        }

        public void Excluir(S_Mercado_Meal c)
        {
            try
            {
                Con.DeleteObject(c); //Prepara a deleção
                Con.SaveChanges(); //Executa a transação (commit)
            }
            catch
            {
                throw;
            }
        }

        public List<S_Mercado_Meal> ListarTodos()
        {
            try
            {
                //SQL -> select * from S_Mercado_Meal
                return Con.S_Mercado_Meal.ToList();
            }
            catch
            {
                throw;
            }
        }

        public List<S_Mercado_Meal> ListarTodosLista(int IdPeriodo)
        {
            try
            {

                return Con.S_Mercado_Meal.Where(m => m.S_merc_periodo_id == IdPeriodo).ToList();

            }
            catch
            {
                throw;
            }
        }

        public object ListarTodos(Int32 PeriodoID)
        {
            try
            {
                var query = from m in Con.S_Meal
                            join mm in Con.S_Mercado_Meal on m.S_meal_id equals mm.S_meal_id
                            join mts in Con.S_Mercado_Tarifa_Status on mm.S_merc_tarif_status_id equals mts.S_mercado_tarifa_status_id into leftjoin
                            from lf in leftjoin.DefaultIfEmpty()
                            where mm.S_merc_periodo_id == PeriodoID
                            orderby m.S_meal_nome ascending
                            select new
                            {
                                mm.S_merc_meal_tarifa_total,
                                mm.S_merc_meal_id,
                                m.S_meal_nome,
                                mm.S_merc_meal_tarifa,
                                lf.S_mercado_tarifa_status_nome,
                                mm.AddFile
                            };
                return query.ToList();
            }
            catch
            {
                throw;
            }
        }

        public object ListarTodos(int PeriodoID, int IdBase)
        {
            try
            {
                var query = from m in Con.S_Meal
                            join mm in Con.S_Mercado_Meal on m.S_meal_id equals mm.S_meal_id
                            join tb in Con.S_Tarifa_Base on mm.S_merc_meal_id equals tb.S_merc_meal_id
                            join mts in Con.S_Mercado_Tarifa_Status on mm.S_merc_tarif_status_id equals mts.S_mercado_tarifa_status_id into leftjoin
                            from lf in leftjoin.DefaultIfEmpty()
                            where mm.S_merc_periodo_id == PeriodoID &&
                                  tb.Base_id == IdBase
                            orderby m.S_meal_nome ascending
                            select new
                            {
                                mm.S_merc_meal_tarifa_total,
                                mm.S_merc_meal_id,
                                m.S_meal_nome,
                                mm.S_merc_meal_tarifa,
                                lf.S_mercado_tarifa_status_nome,
                                mm.AddFile
                            };
                return query.ToList();
            }
            catch
            {
                throw;
            }
        }

        public S_Mercado_Meal ObterPorId(int IdMercadoMeal)
        {
            try
            {
                //select * from TbCliente where IdCliente = ?
                return Con.S_Mercado_Meal.Where(c => c.S_merc_meal_id == IdMercadoMeal).Single();

                //Single -> Retorna apenas 1 Registro e dá erro para qualquer
                //          resultado diferente de 1 Registro.
            }
            catch
            {
                throw;
            }
        }

        public bool VerificaMealCadastrado(S_Mercado_Meal c)
        {
            try
            {

                return Con.S_Mercado_Meal.Where(m => m.S_meal_id == c.S_meal_id &&
                                                m.S_merc_tarif_status_id == c.S_merc_tarif_status_id &&
                                                m.S_merc_periodo_id == c.S_merc_periodo_id)
                                                .Count() != 0;

            }
            catch
            {
                throw;
            }
        }

        public void Atualizar(S_Mercado_Meal registroNovo)
        {
            try
            {
                //Buscar na base de dados o Registro antigo
                S_Mercado_Meal registroAntigo = ObterPorId(registroNovo.S_merc_meal_id);

                //Atualizando os dados
                registroAntigo.S_meal_id = registroNovo.S_meal_id;
                registroAntigo.S_merc_meal_tarifa = registroNovo.S_merc_meal_tarifa;
                registroAntigo.S_merc_meal_tarifa_total = registroNovo.S_merc_meal_tarifa_total;
                registroAntigo.S_merc_tarif_status_id = registroNovo.S_merc_tarif_status_id;
                registroAntigo.S_merc_periodo_id = registroNovo.S_merc_periodo_id;


                //Executo a transação
                Con.SaveChanges();
            }
            catch
            {
                throw;
            }
        }

        public void AtualizarAddFile(S_Mercado_Meal registroNovo)
        {
            try
            {
                S_Mercado_Meal registroAntigo = ObterPorId(registroNovo.S_merc_meal_id);
             
                registroAntigo.AddFile = registroNovo.AddFile;                
                
                Con.SaveChanges();
            }
            catch
            {
                throw;
            }
        }

        public object ListarMealsPorPH(int IdSupplier, DateTime DataFrom, DateTime DataTo, string estacao, string Fds, string nomePacote)
        {
            try
            {
                if (!String.IsNullOrEmpty(nomePacote) && Fds.Equals(""))
                {
                    return (from sml in Con.S_Meal
                            join smm in Con.S_Mercado_Meal on sml.S_meal_id equals smm.S_meal_id
                            join smp in Con.S_Mercado_Periodo on smm.S_merc_periodo_id equals smp.S_merc_periodo_id
                            join sme in Con.S_Mercado_Estacao on smp.S_mercado_estacao_id equals sme.S_mercado_estacao_id
                            join mod in Con.Moeda on smp.Moeda_id equals mod.Moeda_id
                            join sms in Con.S_Mercado_Tarifa_Status on smm.S_merc_tarif_status_id equals sms.S_mercado_tarifa_status_id into leftjoin
                            from lf in leftjoin.DefaultIfEmpty()
                            where smp.S_id == IdSupplier &&
                                  smp.S_merc_periodo_from == DataFrom &&
                                  smp.S_merc_periodo_to == DataTo &&
                                  sme.S_mercado_estacao_nome.Equals(estacao) &&
                                  smp.Pacote_nome.Equals(nomePacote)
                            select new
                            {
                                smp.S_merc_periodo_from,
                                smp.S_merc_periodo_to,
                                sml.S_meal_nome,
                                smm.S_merc_meal_id,
                                lf.S_mercado_tarifa_status_nome,
                                smm.S_merc_meal_tarifa,
                                smm.S_merc_meal_tarifa_total,
                                sme.S_mercado_estacao_nome,
                                mod.Moeda_sigla,
                                mod.Moeda_nome,
                                mod.Moeda_id,
                                S_id = smp.S_id
                            }).ToList();
                }          
                else if (Fds.Equals(""))
                {
                    return (from sml in Con.S_Meal
                            join smm in Con.S_Mercado_Meal on sml.S_meal_id equals smm.S_meal_id
                            join smp in Con.S_Mercado_Periodo on smm.S_merc_periodo_id equals smp.S_merc_periodo_id
                            join sme in Con.S_Mercado_Estacao on smp.S_mercado_estacao_id equals sme.S_mercado_estacao_id
                            join mod in Con.Moeda on smp.Moeda_id equals mod.Moeda_id
                            join sms in Con.S_Mercado_Tarifa_Status on smm.S_merc_tarif_status_id equals sms.S_mercado_tarifa_status_id into leftjoin
                            from lf in leftjoin.DefaultIfEmpty()
                            where smp.S_id == IdSupplier &&
                                  smp.S_merc_periodo_from == DataFrom &&
                                  smp.S_merc_periodo_to == DataTo &&
                                  sme.S_mercado_estacao_nome.Equals(estacao)
                            select new
                            {
                                smp.S_merc_periodo_from,
                                smp.S_merc_periodo_to,
                                sml.S_meal_nome,
                                smm.S_merc_meal_id,
                                lf.S_mercado_tarifa_status_nome,
                                smm.S_merc_meal_tarifa,
                                smm.S_merc_meal_tarifa_total,
                                sme.S_mercado_estacao_nome,
                                mod.Moeda_sigla,
                                mod.Moeda_nome,
                                mod.Moeda_id,
                                S_id = smp.S_id
                            }).ToList();
                }
                else if (!Fds.Equals("") && !String.IsNullOrEmpty(nomePacote))
                {
                    return (from sml in Con.S_Meal
                            join smm in Con.S_Mercado_Meal on sml.S_meal_id equals smm.S_meal_id
                            join smp in Con.S_Mercado_Periodo on smm.S_merc_periodo_id equals smp.S_merc_periodo_id
                            join sme in Con.S_Mercado_Estacao on smp.S_mercado_estacao_id equals sme.S_mercado_estacao_id
                            join mod in Con.Moeda on smp.Moeda_id equals mod.Moeda_id
                            join sms in Con.S_Mercado_Tarifa_Status on smm.S_merc_tarif_status_id equals sms.S_mercado_tarifa_status_id into leftjoin
                            from lf in leftjoin.DefaultIfEmpty()
                            where smp.S_id == IdSupplier &&
                                  smp.S_merc_periodo_from == DataFrom &&
                                  smp.S_merc_periodo_to == DataTo &&
                                  sme.S_mercado_estacao_nome.Equals(estacao) &&
                                  smp.S_merc_periodo_fdsFrom.Equals(Fds) &&
                                  smp.Pacote_nome.Equals(nomePacote)
                            select new
                            {
                                smp.S_merc_periodo_from,
                                smp.S_merc_periodo_to,
                                sml.S_meal_nome,
                                smm.S_merc_meal_id,
                                lf.S_mercado_tarifa_status_nome,
                                smm.S_merc_meal_tarifa,
                                smm.S_merc_meal_tarifa_total,
                                sme.S_mercado_estacao_nome,
                                mod.Moeda_sigla,
                                mod.Moeda_nome,
                                mod.Moeda_id,
                                S_id = smp.S_id
                            }).ToList();
                }
                else
                {
                    return (from sml in Con.S_Meal
                            join smm in Con.S_Mercado_Meal on sml.S_meal_id equals smm.S_meal_id
                            join smp in Con.S_Mercado_Periodo on smm.S_merc_periodo_id equals smp.S_merc_periodo_id
                            join sme in Con.S_Mercado_Estacao on smp.S_mercado_estacao_id equals sme.S_mercado_estacao_id
                            join mod in Con.Moeda on smp.Moeda_id equals mod.Moeda_id
                            join sms in Con.S_Mercado_Tarifa_Status on smm.S_merc_tarif_status_id equals sms.S_mercado_tarifa_status_id into leftjoin
                            from lf in leftjoin.DefaultIfEmpty()
                            where smp.S_id == IdSupplier &&
                                  smp.S_merc_periodo_from == DataFrom &&
                                  smp.S_merc_periodo_to == DataTo &&
                                  sme.S_mercado_estacao_nome.Equals(estacao) &&
                                  smp.S_merc_periodo_fdsFrom.Equals(Fds)
                            select new
                            {
                                smp.S_merc_periodo_from,
                                smp.S_merc_periodo_to,
                                sml.S_meal_nome,
                                smm.S_merc_meal_id,
                                lf.S_mercado_tarifa_status_nome,
                                smm.S_merc_meal_tarifa,
                                smm.S_merc_meal_tarifa_total,
                                sme.S_mercado_estacao_nome,
                                mod.Moeda_sigla,
                                mod.Moeda_nome,
                                mod.Moeda_id,
                                S_id = smp.S_id
                            }).ToList();
                }

            }
            catch 
            {                
                throw;
            }
        }

        public object ListarMealsPorPH(int IdSupplier, DateTime DataFrom, DateTime DataTo, string estacao, int numPaxs, string nomePacote)
        {
            try
            {

                if (String.IsNullOrEmpty(nomePacote))
                {

                    return (from sml in Con.S_Meal
                            join smm in Con.S_Mercado_Meal on sml.S_meal_id equals smm.S_meal_id
                            join smp in Con.S_Mercado_Periodo on smm.S_merc_periodo_id equals smp.S_merc_periodo_id
                            join sme in Con.S_Mercado_Estacao on smp.S_mercado_estacao_id equals sme.S_mercado_estacao_id
                            join mod in Con.Moeda on smp.Moeda_id equals mod.Moeda_id
                            join sba in Con.S_Bases on mod.Moeda_id equals sba.Moeda_id
                            join stb in Con.S_Tarifa_Base on new { SID = (int)smm.S_merc_meal_id, BAS = (int)sba.Base_id } equals new { SID = (int)stb.S_merc_meal_id, BAS = (int)stb.Base_id }
                            join sms in Con.S_Mercado_Tarifa_Status on smm.S_merc_tarif_status_id equals sms.S_mercado_tarifa_status_id into leftjoin
                            from lf in leftjoin.DefaultIfEmpty()
                            where smp.S_id == IdSupplier &&
                                  smp.S_merc_periodo_from == DataFrom &&
                                  smp.S_merc_periodo_to == DataTo &&
                                  sme.S_mercado_estacao_nome.Equals(estacao) &&
                                  sba.Base_de <= numPaxs &&
                                  sba.Base_ate >= numPaxs
                            select new
                            {
                                smp.S_merc_periodo_from,
                                smp.S_merc_periodo_to,
                                sml.S_meal_nome,
                                smm.S_merc_meal_id,
                                lf.S_mercado_tarifa_status_nome,
                                smm.S_merc_meal_tarifa,
                                smm.S_merc_meal_tarifa_total,
                                sme.S_mercado_estacao_nome,
                                mod.Moeda_sigla,
                                mod.Moeda_nome,
                                mod.Moeda_id,
                                S_id = smp.S_id
                            }).ToList();
                }
                else
                {
                    return (from sml in Con.S_Meal
                            join smm in Con.S_Mercado_Meal on sml.S_meal_id equals smm.S_meal_id
                            join smp in Con.S_Mercado_Periodo on smm.S_merc_periodo_id equals smp.S_merc_periodo_id
                            join sme in Con.S_Mercado_Estacao on smp.S_mercado_estacao_id equals sme.S_mercado_estacao_id
                            join mod in Con.Moeda on smp.Moeda_id equals mod.Moeda_id
                            join sba in Con.S_Bases on mod.Moeda_id equals sba.Moeda_id
                            join stb in Con.S_Tarifa_Base on new { SID = (int)smm.S_merc_meal_id, BAS = (int)sba.Base_id } equals new { SID = (int)stb.S_merc_meal_id, BAS = (int)stb.Base_id }
                            join sms in Con.S_Mercado_Tarifa_Status on smm.S_merc_tarif_status_id equals sms.S_mercado_tarifa_status_id into leftjoin
                            from lf in leftjoin.DefaultIfEmpty()
                            where smp.S_id == IdSupplier &&
                                  smp.S_merc_periodo_from == DataFrom &&
                                  smp.S_merc_periodo_to == DataTo &&
                                  sme.S_mercado_estacao_nome.Equals(estacao) &&
                                  smp.Pacote_nome.Equals(nomePacote) &&
                                  sba.Base_de <= numPaxs &&
                                  sba.Base_ate >= numPaxs
                            select new
                            {
                                smp.S_merc_periodo_from,
                                smp.S_merc_periodo_to,
                                sml.S_meal_nome,
                                smm.S_merc_meal_id,
                                lf.S_mercado_tarifa_status_nome,
                                smm.S_merc_meal_tarifa,
                                smm.S_merc_meal_tarifa_total,
                                sme.S_mercado_estacao_nome,
                                mod.Moeda_sigla,
                                mod.Moeda_nome,
                                mod.Moeda_id,
                                S_id = smp.S_id
                            }).ToList();
                }

            }
            catch
            {
                throw;
            }
        }

        public List<S_Mercado_Meal> ListarAddFile(int IdPeriodo)
        {
            try
            {
                return Con.S_Mercado_Meal.Where(m => m.S_merc_periodo_id == IdPeriodo && m.AddFile == true).ToList();
            }
            catch 
            {                
                throw;
            }
        }

    }
}
